/*
 * 打印操作由 std::fmt 里面所定义的一系列宏来处理，包括
 * - format! 将格式化文本写到字符串
 * - print! 与format! 类似，但将文本输出到控制台
 * - println! 和print! 相比多一个换行
 * - eprint! 与print! 类似，但将文本输出到标准错误
 * - eprintln! 与 eprint! 相比多一个换行
 *
 * 格式化的正确性在编译时检查
 */

fn main() {
    // 通常，`{}`会被任意变量内容所替换
    // 变量内容会转化成字符串
    println!("{} days", 31);

    // 不加后缀的话，31 自动成为 i32 类型
    // 可以添加后缀改变31的类型，比如用 31i64 声明31为 i64 类型

    // 用变量替换字符串有多种写法
    // 比如可以使用位置参数
    println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");

    // 可以使用命名参数
    println!("{subject} {verb} {object}",
            object="the lazy dog",
            subject="the quick brown fox",
            verb="jumps over");

    // 可以在`:`后面指定特殊的格式
    // 以下将2转成二进制数
    println!("{} of {:b} people know binary, the other half don't", 1, 2);

    // 可以按指定宽度来右对齐文本
    // 下面语句输出"     1"，5个空格后连着1
    println!("{number:>width$}", number=1, width=6);

    // 可以在数字左边补0,下面语句输出 "000001"
    println!("{number:>0width$}", number=1, width=6);

    // println! 会检查使用到的参数数量是否正确
    //println!("My name is {0}, {1} {0}", "Bond");

    // 创建一个包含单个 `i32`的结构体，命名为 `Structure`
    #[allow(dead_code)]
    #[derive(Debug)]
    struct Structure(i32);

    // 像结构体这样的自定义类型需要复杂的方式来处理
    // 比如 {:?}
    println!("This struct `{:?}`", Structure(3));
}
